LeetCode 135. Candy
Description
There are N children standing in a line. Each child is assigned a rating value.
You are giving candies to these children subjected to the following requirements:
- Each child must have at least one candy.
- Children with a higher rating get more candies than their neighbors.
What is the minimum candies you must give?
Solution
由于要尽可能少发糖,可以先确定一批可以只发一颗糖的孩子(左右相邻的孩子的rating都不小于他),这样与这些孩子相邻的孩子就可以发两颗糖,依次类推。
题目转化为了拓扑排序,求对于每一个孩子第几批能确定所要发的糖果数量(第一批确定的糖果数量是1,第二批是2,第三批是3…)。
用一个图记录各个节点之间的大小关系,图用邻接矩阵表示,可以定义一个顶点代表一个孩子,一条由a孩子指向b孩子的边代表a孩子的rating比b孩子高。用一个数组记录每个小孩所应发的糖果数量。遍历数组,当发现第i个小孩的糖果数量还没确定时,就根据与他相邻的小孩的情况试图确定第这个小孩的糖果数量,如果与他相邻的小孩的发糖数量还没确定,就根据当前已经确定的小孩的糖果数量和邻接矩阵中的信息,把问题转化为确定与他相邻的小孩的发糖数量。这样就形成一个深度优先搜索。
算法的时间复杂度O(n),空间复杂度O(n)。
Caution
1.当试图确定的是第一个和最后一个小孩的发糖数量时,与他相邻的孩子只有一个,需要特殊处理。
2.当与相邻小孩的rating相等,和比相邻小孩的rating小这两种情况是一样的(相等情况)。
3.当N等于1时,直接返回1。
4.由于所要建立的图的边只涉及到相邻节点之间的边,实际只要使用一个N×2的数组即可实现图的存储,无需N×N的数组。
Code
|
|